package part3;

import java.util.ArrayList;
import java.util.List;

// 分发器，所有事件都会发到这里来
public class DispatchServlet {
    public static List<HandlerAdapter> handlerAdapterList = new ArrayList<>();

    // 这个方法也很笨！适配器应该用注解反射来自动注册。
    public DispatchServlet() {
        handlerAdapterList.add(new AnnotationHandlerAdapter());
        handlerAdapterList.add(new HttpHandlerAdapter());
        handlerAdapterList.add(new SimpleHandlerAdapter());
    }

    // 分发事件，收到一个请求，分发到对应的处理的Controller上面去
    // 请注意这里controller的函数是多种多样的，甚至controller的调用还会非常复杂！！！
    // 你可能设计几十步，上百步的执行。但是你只需要调用适配的handle方法！
    // 你的该方法就可以很久不用修改了！
    // 就算增加心的controller，你也不需要修改你的已有的适配器和controller，并且不需要更改分发类
    public void doDispatch(Controller controller) {
        HandlerAdapter adapter = getHandle(controller);
        adapter.handle(controller); // 执行handle方法
    }

    // 查找对应的适配器
    public HandlerAdapter getHandle(Controller controller) {
        for (HandlerAdapter adapter : handlerAdapterList) {
            if (adapter.support(controller)) {
                return adapter;
            }
        }
        return null; // 这里应该是抛出异常，找不到适配器就应该报错
    }

    public static void main(String[] args) { // 模拟进行事件接受，假如接收到了三个事件
        DispatchServlet dispatchServlet = new DispatchServlet();
        AnnotationController controller = new AnnotationController();
        dispatchServlet.doDispatch(controller);
        HttpController controller1 = new HttpController();
        dispatchServlet.doDispatch(controller1);
        SimpleController controller2 = new SimpleController();
        dispatchServlet.doDispatch(controller2);
    }
}